package com.dqyt.khjc.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.dqyt.app.bean.UserInfo;
import com.dqyt.app.config.AppConfig;
import com.dqyt.common.check.CheckTool;
import com.dqyt.common.constant.AuthorityID;
import com.dqyt.common.constant.Opt;
import com.dqyt.common.utils.UserInfoUtil;
import com.dqyt.khjc.bean.DownFileBean;
import com.dqyt.khjc.bean.HistoryBean;
import com.dqyt.khjc.bean.ResultMsg;
import com.dqyt.khjc.bean.User;
import com.dqyt.khjc.config.Config;
import com.dqyt.khjc.mapper.DownFileMapper;
import com.dqyt.khjc.mapper.HistoryMapper;
import com.dqyt.khjc.mapper.UserMapper;
import com.dqyt.khjc.utils.*;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;


/**
 * 上传图片
 */
@Service
public class FileService {

    @Autowired
    private HistoryMapper historyMapper;

    @Autowired
    private UserMapper mUserMapper;
    @Autowired
    private DownFileMapper downFileMapper;

//    /**
//     * 上传图片文件
//     *
//     * @param request
//     * @param file
//     * @param optype  操作类型
//     * @return
//     */
//    public ResultMsg fileUpload(HttpServletRequest request, MultipartFile file, int optype) {
//        ResultMsg ret = new ResultMsg(); // 声明一个返回值
//        try {
//            // 检查用户是否登录Token是否正确
//            ret = UserInfoUtil.isAuthori_Web(request);
//            // 如果有错误信息
//            if (ret != null) {
//                return ret;
//            }
//            ret = new ResultMsg(); // 声明一个返回值
//            // 权限检查
//            // 首先取得用户信息
//            User user = UserInfoUtil.getUser_Web(request);
//            // 用户权限检查 是否可以新增客户信息
//            if (!CheckTool.checkAuthority(user, AuthorityID.GRXXGL_GRXXSZ)) {
//                ret.setCode(ResultMsg.ERROR);
//                ret.setMsg("你没有对应的操作权限");
//                return ret;
//            }
//
//
//
//
//            String FolderNmae = "/" + FileNameUtils.getFolderNmae();
//
//            if(Config.isLocahost){//如果是本地服务器
//
//                String localPath = Config.UPLOADFOLDER + FolderNmae;
//                String fileName = FileUtils.upload(file, localPath, file.getOriginalFilename());
//                if (null != fileName) {
//                    MultipartHttpServletRequest multipartRequest  =  (MultipartHttpServletRequest)  request;
//                    //相当于获取form表单隐藏域的参数
//                    String  resourceId  = "";
//                    //获取form表单要上传的文件
//                    //MultipartFile  file  =  multipartRequest.getFile("file");
//
//                    File mmfile = new File(localPath+"/"+fileName);
//                    if (mmfile.exists()) {
//                        FileItem fileItem = FileUtils.getMultipartFile(mmfile,"templFileItem");
//                        MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
//
//                        //获取文件的文件名字(后面要用到)
//                        String  filename  =  multipartFile.getOriginalFilename();
//                        //这个url是要上传到另一个服务器上接口
//                        String  url  =  String.format(Config.DISTANCE_UPLOAD_FILE);
//                        Object  object  =  null;
//                        //创建HttpClients实体类
//                        CloseableHttpClient  aDefault  =  HttpClients.createDefault();
//                        try {
//                            HttpPost httpPost = new HttpPost(url);
//                            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//                            //这里就是自己踩的坑,需要使用file.getBytes()
//                            //builder.addBinaryBody("file",file.getInputStream(),ContentType.create("multipart/form-data"),filename);
//                            //使用这个，另一个服务就可以接收到这个file文件了
//                            builder.addBinaryBody("file", multipartFile.getBytes(), ContentType.create("multipart/form-data"), filename);
//                            StringBody stringBody = new StringBody(resourceId, ContentType.MULTIPART_FORM_DATA);
//                           // builder.addPart("resource_id", stringBody);
//                            HttpEntity entity = builder.build();
//                            httpPost.setEntity(entity);
//                            ResponseHandler<Object> rh = new ResponseHandler<Object>() {
//                                @Override
//                                public Object handleResponse(HttpResponse response) throws IOException {
//                                    HttpEntity entity = response.getEntity();
//                                    String result = EntityUtils.toString(entity, "UTF-8");
//                                    return result;
//                                }
//                            };
//                            aDefault = HttpClients.createDefault();
//                            object = aDefault.execute(httpPost, rh);
//
//                        }catch(Exception e){
//                            System.out.println(e.getMessage());
//                        }
//                    }
//
//
//
//                    String avatarUrl = Config.STATICACCESSPATH + FolderNmae + "/" + fileName;
//                    ret.setCode(ResultMsg.SUCESS);
//                    ret.setMsg("上传成功");
//                    ret.setData(avatarUrl);
//                    //添加操作记录
//                    // 先取得用户ip
//                    String ip = IpUtil.getIpAddr(request);
//                    HistoryBean historyBean = new HistoryBean();
//                    historyBean.setMessage("[" + user.getUserName() + "] 上传了一张图片： [" + avatarUrl + "]");
//                    historyBean.setType(optype);
//                    historyBean.setOpUserId(user.getUserId());
//                    historyBean.setIp(ip);
//                    historyBean.setBopId(String.valueOf(user.getUserId()));
//                    historyBean.setAddTime(TimeUtil.currentTimeMillis());
//                    historyBean.setAddUser(String.valueOf(user.getUserId()));
//                    historyBean.setUpdateTime(TimeUtil.currentTimeMillis());
//                    historyBean.setUpdateUser(String.valueOf(user.getUserId()));
//                    //插入数据库
//                    int ress = historyMapper.addHistory(historyBean);
//                } else {
//                    ret.setCode(ResultMsg.ERROR);
//                    ret.setMsg("上传失败");
//                }
//            }else{  //是远程服务器   这里上传的数据 都需要下载到本地服务器才行
//                String localPath = Config.UPLOADFOLDER + FolderNmae;
//                System.out.println("lllllllllllllllllllllllllllllllllllllllllllll="+localPath);
//                String fileName = FileUtils.upload(file, localPath, file.getOriginalFilename());
//                if (null != fileName) {
//                    String avatarUrl =  FolderNmae + "/" + fileName;
//
//                    //将上传的文件保存到要下载的数据库
//                    DownFileBean downFileBean = new DownFileBean();
//                    downFileBean.setFileUrl(avatarUrl);
//                    int mres = downFileMapper.addDownFile(downFileBean);
//                    if(mres>0){
//                        ret.setCode(ResultMsg.SUCESS);
//                        ret.setMsg("上传成功");
//                        ret.setData(avatarUrl);
//                        //添加操作记录
//                        // 先取得用户ip
//                        String ip = IpUtil.getIpAddr(request);
//                        HistoryBean historyBean = new HistoryBean();
//                        historyBean.setMessage("[" + user.getUserName() + "] 上传了一张图片： [" + avatarUrl + "]");
//                        historyBean.setType(optype);
//                        historyBean.setOpUserId(user.getUserId());
//                        historyBean.setIp(ip);
//                        historyBean.setBopId(String.valueOf(user.getUserId()));
//                        historyBean.setAddTime(TimeUtil.currentTimeMillis());
//                        historyBean.setAddUser(String.valueOf(user.getUserId()));
//                        historyBean.setUpdateTime(TimeUtil.currentTimeMillis());
//                        historyBean.setUpdateUser(String.valueOf(user.getUserId()));
//                        //插入数据库
//                        int ress = historyMapper.addHistory(historyBean);
//                    }else{
//                        ret.setCode(ResultMsg.ERROR);
//                        ret.setMsg("上传失败");
//                    }
//
//                } else {
//                    ret.setCode(ResultMsg.ERROR);
//                    ret.setMsg("上传失败");
//                }
//            }
//
//
//
//
//
//
//        } catch (Exception e) {
//            ret.setCode(ResultMsg.ERROR);
//            ret.setMsg("未知的错误，请稍候再试！");
//            e.printStackTrace();
//        }
//        return ret;
//    }



    /**
     * 上传图片文件
     * @param request
     * @param file
     * @param optype 操作类型
     * @return
     */
    public ResultMsg fileUpload(HttpServletRequest request,MultipartFile file,int optype){
        ResultMsg ret = new ResultMsg(); // 声明一个返回值
        try {
            // 检查用户是否登录Token是否正确
            ret = UserInfoUtil.isAuthori_Web(request);
            // 如果有错误信息
            if (ret != null) {
                return ret;
            }
            ret = new ResultMsg(); // 声明一个返回值
            // 权限检查
            // 首先取得用户信息
            User user = UserInfoUtil.getUser_Web(request);
            // 用户权限检查 是否可以新增客户信息
//            if (!CheckTool.checkAuthority(user, AuthorityID.GRXXGL_GRXXSZ)) {
//                ret.setCode(ResultMsg.ERROR);
//                ret.setMsg("你没有对应的操作权限");
//                return ret;
//            }
            String FolderNmae = "/" + FileNameUtils.getFolderNmae();
            String localPath = Config.UPLOADFOLDER + FolderNmae;
            //System.out.println("lllllllllllllllllllllllllllllll==="+localPath);
            String fileName = FileUtils.upload(file, localPath, file.getOriginalFilename());
            if (null != fileName) {
                String avatarUrl = Config.STATICACCESSPATH + FolderNmae + "/" + fileName;
                ret.setCode(ResultMsg.SUCESS);
                ret.setMsg("上传成功");
                ret.setData(avatarUrl);

                //添加操作记录
                // 先取得用户ip
                String ip = IpUtil.getIpAddr(request);
                HistoryBean historyBean = new HistoryBean();
                historyBean.setMessage("[" + user.getUserName() + "] 上传了一张图片： [" + avatarUrl + "]");
                historyBean.setType(optype);
                historyBean.setOpUserId(user.getUserId());
                historyBean.setIp(ip);
                historyBean.setBopId(String.valueOf(user.getUserId()));
                historyBean.setAddTime(TimeUtil.currentTimeMillis());
                historyBean.setAddUser(String.valueOf(user.getUserId()));
                historyBean.setUpdateTime(TimeUtil.currentTimeMillis());
                historyBean.setUpdateUser(String.valueOf(user.getUserId()));
                //插入数据库
                int ress = historyMapper.addHistory(historyBean);
            }else{
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("上传失败");
            }
        }catch (Exception e) {
            ret.setCode(ResultMsg.ERROR);
            ret.setMsg("未知的错误，请稍候再试！");
            e.printStackTrace();
        }
        return ret;
    }


    /**
     * 上传图片文件-- APP
     *
     * @param request
     * @param userId
     * @param token
     * @param files
     * @param optype
     * @return
     */
    public ResultMsg fileUploadApp(HttpServletRequest request, long userId, String token, MultipartFile[] files, int optype) {
        ResultMsg ret = new ResultMsg(); // 声明一个返回值
        try {
            // 检查用户是否登录Token是否正确
            ret = UserInfoUtil.isAuthori_App(userId, token);
            // 如果有错误信息
            if (ret != null) {
                return ret;
            }
            ret = new ResultMsg(); // 声明一个返回值
            // 首先取得用户信息
            UserInfo userInfo = UserInfoUtil.getUser_App(userId);

            List<String> fileNames = new ArrayList<>();

            for (MultipartFile file : files) {
                String FolderNmae = "/" + FileNameUtils.getFolderNmaeApp();
                String localPath = Config.UPLOADFOLDER + FolderNmae;
                String fileName = FileUtils.upload(file, localPath, file.getOriginalFilename());
                String avatarUrl = Config.STATICACCESSPATH + FolderNmae + "/" + fileName;
                fileNames.add(avatarUrl);
            }

            // 如果用户更新头像
            if (optype == Opt.APP_UPDATE_TX) {
                userInfo.getUser().setAvatar(fileNames.get(0)); // 设置头像
                userInfo.getUser().setUpdateUser(userInfo.getUser().getUserId() + "");
                userInfo.getUser().setUpdateTime(TimeUtil.getCurrentTimeMillis()); // 设置头像

                mUserMapper.updateUserTxById(userInfo.getUser()); // 更新数据
                UserInfoUtil.saveUser_App(userInfo);
            }


            if (fileNames.size() > 0) {
                ret.setCode(ResultMsg.SUCESS);
                ret.setMsg("上传成功");
                ret.setData(JSON.toJSONString(fileNames));

                //添加操作记录
                // 先取得用户ip
                String ip = IpUtil.getIpAddr(request);
                HistoryBean historyBean = new HistoryBean();
                historyBean.setMessage("[" + userInfo.getUser().getUserName() + "] 从APP上传了" + fileNames.size() + "张图片");
                historyBean.setType(optype);
                historyBean.setOpUserId(userInfo.getUser().getUserId());
                historyBean.setIp(ip);
                historyBean.setBopId(String.valueOf(userInfo.getUser().getUserId()));
                historyBean.setAddTime(TimeUtil.currentTimeMillis());
                historyBean.setAddUser(String.valueOf(userInfo.getUser().getUserId()));
                historyBean.setUpdateTime(TimeUtil.currentTimeMillis());
                historyBean.setUpdateUser(String.valueOf(userInfo.getUser().getUserId()));
                //插入数据库
                int ress = historyMapper.addHistory(historyBean);
            } else {
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("上传失败");
            }
        } catch (Exception e) {
            ret.setCode(ResultMsg.ERROR);
            ret.setMsg("未知的错误，请稍候再试！");
            e.printStackTrace();
        }
        return ret;
    }

    /**
     * 上传 bsae64的图片
     *
     * @param request
     * @param base64Data
     * @param optype     操作类型
     * @return
     */
    public ResultMsg base64Upload(HttpServletRequest request, String base64Data, int optype) {
        ResultMsg ret = new ResultMsg(); // 声明一个返回值
        try {
            // 检查用户是否登录Token是否正确
            ret = UserInfoUtil.isAuthori_Web(request);
            // 如果有错误信息
            if (ret != null) {
                return ret;
            }
            ret = new ResultMsg(); // 声明一个返回值
            // 权限检查
            // 首先取得用户信息
            User user = UserInfoUtil.getUser_Web(request);
            // 用户权限检查 是否可以新增客户信息
//            if (!CheckTool.checkAuthority(user, AuthorityID.GRXXGL_GRXXSZ)) {
//                ret.setCode(ResultMsg.ERROR);
//                ret.setMsg("你没有对应的操作权限");
//                return ret;
//            }
            String dataPrix = ""; // base64格式前头
            String data = "";// 实体部分数据
            if (base64Data == null || "".equals(base64Data)) {
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("上传失败");
                return ret;
            } else {
                String[] d = base64Data.split("base64,");// 将字符串分成数组
                if (d != null && d.length == 2) {
                    dataPrix = d[0];
                    data = d[1];
                } else {
                    ret.setCode(ResultMsg.ERROR);
                    ret.setMsg("上传失败");
                    return ret;
                }
            }
            String suffix = "";// 图片后缀，用以识别哪种格式数据
            // 编码的jpeg图片数据
            if ("data:image/jpeg;".equalsIgnoreCase(dataPrix)) {
                suffix = ".jpg";
            } else if ("data:image/x-icon;".equalsIgnoreCase(dataPrix)) {
                // 编码的icon图片数据
                suffix = ".ico";
            } else if ("data:image/gif;".equalsIgnoreCase(dataPrix)) {
                // 编码的gif图片数据
                suffix = ".gif";
            } else if ("data:image/png;".equalsIgnoreCase(dataPrix)) {
                // 编码的png图片数据
                suffix = ".png";
            } else {
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("上传失败");
                return ret;
            }
            String uuid = UUIDUtils.generateShortUuid();
            String tempFileName = uuid + suffix;
            String FolderNmae = "/" + FileNameUtils.getFolderNmae();
            String imgFilePath = Config.UPLOADFOLDER + FolderNmae + "/" + tempFileName;// 新生成的图片
            File dest = new File(imgFilePath);
            // 判断文件父目录是否存在
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            try {
                // Base64解码
                byte[] b = java.util.Base64.getDecoder().decode(data);
                for (int i = 0; i < b.length; ++i) {
                    if (b[i] < 0) {
                        // 调整异常数据
                        b[i] += 256;
                    }
                }
                OutputStream out = new FileOutputStream(imgFilePath);
                out.write(b);
                out.flush();
                out.close();
                // imageService.save(imgurl);
                String avatarUrl = Config.STATICACCESSPATH + FolderNmae + "/" + tempFileName;
                ret.setCode(ResultMsg.SUCESS);
                ret.setMsg("上传成功");
                ret.setData(avatarUrl);

                //添加操作记录
                // 先取得用户ip
                String ip = IpUtil.getIpAddr(request);
                HistoryBean historyBean = new HistoryBean();
                historyBean.setMessage("[" + user.getUserName() + "] 上传了一张图片： [" + avatarUrl + "]");
                historyBean.setType(optype);
                historyBean.setOpUserId(user.getUserId());
                historyBean.setIp(ip);
                historyBean.setBopId(String.valueOf(user.getUserId()));
                historyBean.setAddTime(TimeUtil.currentTimeMillis());
                historyBean.setAddUser(String.valueOf(user.getUserId()));
                historyBean.setUpdateTime(TimeUtil.currentTimeMillis());
                historyBean.setUpdateUser(String.valueOf(user.getUserId()));
                //插入数据库
                int ress = historyMapper.addHistory(historyBean);
                return ret;
            } catch (IOException e) {
                e.printStackTrace();
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("上传失败");
                return ret;
            }
        } catch (Exception e) {
            ret.setCode(ResultMsg.ERROR);
            ret.setMsg("未知的错误，请稍候再试！");
            e.printStackTrace();
        }
        return ret;
    }



//    /**
//     *  上传图片文件（模拟上传远程文件接口） 真是环境要改地址
//     *
//     * @param request
//     * @param file
//     * @return
//     */
//    public ResultMsg disfileUpload(HttpServletRequest request, MultipartFile file) {
//        ResultMsg ret = new ResultMsg(); // 声明一个返回值
//        try {
//            ret = new ResultMsg(); // 声明一个返回值
//            String FolderNmae = "/" + FileNameUtils.getFolderNmae();
//            MultipartFile file2= file;
//            String localPath2 = Config.UPLOADFOLDER_LOCA + FolderNmae;
//            String fileName2 = FileUtils.upload2(file2, localPath2, file2.getOriginalFilename());
//            if (null !=fileName2) {
//                String avatarUrl = Config.STATICACCESSPATH + FolderNmae + "/" + fileName2;
//                ret.setCode(ResultMsg.SUCESS);
//                ret.setMsg("上传成功");
//                ret.setData(avatarUrl);
//            } else {
//                ret.setCode(ResultMsg.ERROR);
//                ret.setMsg("上传失败");
//            }
//        } catch (Exception e) {
//            ret.setCode(ResultMsg.ERROR);
//            ret.setMsg("未知的错误，请稍候再试！");
//            e.printStackTrace();
//        }
//        return ret;
//    }



//
//    /**
//     *  上传图片文件（模拟上传远程文件接口） 真是环境要改地址
//     *
//     * @param request
//     * @param file
//     * @return
//     */
//    public ResultMsg disfileUpload2(HttpServletRequest request, MultipartFile file) {
//        ResultMsg ret = new ResultMsg(); // 声明一个返回值
//        try {
//            ret = new ResultMsg(); // 声明一个返回值
//            String FolderNmae = "/fhqp";
//            MultipartFile file2= file;
//            String localPath2 = Config.UPLOADFOLDER_LOCA + FolderNmae;
//            String fileName2 = FileUtils.upload2(file2, localPath2, file2.getOriginalFilename());
//            if (null !=fileName2) {
//                String avatarUrl = Config.STATICACCESSPATH + FolderNmae + "/" + fileName2;
//                ret.setCode(ResultMsg.SUCESS);
//                ret.setMsg("上传成功");
//                ret.setData(avatarUrl);
//            } else {
//                ret.setCode(ResultMsg.ERROR);
//                ret.setMsg("上传失败");
//            }
//        } catch (Exception e) {
//            ret.setCode(ResultMsg.ERROR);
//            ret.setMsg("未知的错误，请稍候再试！");
//            e.printStackTrace();
//        }
//        return ret;
//    }



}
